#include "PluginManager.h"
#include <QMessageBox>
#include <QMetaObject>
#include <QDebug>
PluginManager::PluginManager(QObject *parent)
    : QObject(parent)
{
}

PluginManager::~PluginManager()
{
    // 释放插件资源
    for (auto plugin : m_loadedPlugins) {
        delete plugin;
    }
}

void PluginManager::loadPlugins(const QString &pluginsDir) {
    QDir dir(pluginsDir);
    if (!dir.exists()) {
        qWarning() << "插件目录不存在: " << pluginsDir;
        return;
    }

    // 遍历目录下所有DLL文件
    for (const QString &fileName : dir.entryList(QDir::Files)) {
        QPluginLoader loader(dir.filePath(fileName),this);
        QObject *plugin = loader.instance();
        if (plugin) {
            // 验证是否实现插件接口
            CameraPluginInterface *cameraPlugin = qobject_cast<CameraPluginInterface*>(plugin);
            if (cameraPlugin) {
                cameraPlugin->setParent(this);
                m_loadedPlugins.append(cameraPlugin);
                // 连接插件消息发送信号到当前管理类
                connect(cameraPlugin, &CameraPluginInterface::pluginMessageSent,
                        this, &PluginManager::onPluginMessageReceived);
                // 连接插件函数调用请求信号到当前管理类
                connect(cameraPlugin, &CameraPluginInterface::requestPluginFunctionCall,
                        this, &PluginManager::onRequestPluginFunctionCall);
                // 发送加载成功通知
                emit pluginLoaded(cameraPlugin);
                cameraPlugin->initialize();
            } else {
                loader.unload();
            }
        } else {
            qWarning() << "加载插件失败: " << fileName << " 错误: " << loader.errorString();
        }
    }
    
    // 所有插件加载完成后，向所有插件发送框架初始化完成消息
    if (!m_loadedPlugins.isEmpty()) {
        qDebug() << "所有插件加载完成，向" << m_loadedPlugins.size() << "个插件发送初始化完成消息";
        for (CameraPluginInterface *plugin : m_loadedPlugins) {
            plugin->onPluginMessage("MainFrame", CMD_FRAMEWORK_INITIALIZED);
        }
    }
}

bool PluginManager::callPluginFunction(const QString& pluginName, const QString& funcName, const QVariantList& args, QVariant& retVal) {
    // 遍历已加载的插件查找目标插件
    for (CameraPluginInterface *plugin : m_loadedPlugins) {
        if (plugin->pluginName() == pluginName) {
            QObject* pluginObj = qobject_cast<QObject*>(plugin);
            if (!pluginObj) return false;

            // 构造参数数组（支持最多10个参数）
            QGenericArgument argList[10];
            int argCount = qMin(args.size(), 10);
            for (int i = 0; i < argCount; ++i) {
                argList[i] = Q_ARG(QVariant, args.at(i));
            }

            // 调用元对象方法

            //先尝试有返回值的函数
            bool ret=QMetaObject::invokeMethod(
                pluginObj,
                funcName.toLatin1().constData(),
                Q_RETURN_ARG(QVariant, retVal),
                argCount > 0 ? argList[0] : QGenericArgument(),
                argCount > 1 ? argList[1] : QGenericArgument(),
                argCount > 2 ? argList[2] : QGenericArgument(),
                argCount > 3 ? argList[3] : QGenericArgument(),
                argCount > 4 ? argList[4] : QGenericArgument(),
                argCount > 5 ? argList[5] : QGenericArgument(),
                argCount > 6 ? argList[6] : QGenericArgument(),
                argCount > 7 ? argList[7] : QGenericArgument(),
                argCount > 8 ? argList[8] : QGenericArgument(),
                argCount > 9 ? argList[9] : QGenericArgument()
            );
            if(!ret)
            {
               //再尝试无返回值的函数
               ret= QMetaObject::invokeMethod(
                           pluginObj,
                           funcName.toLatin1().constData(),
                           argCount > 0 ? argList[0] : QGenericArgument(),
                           argCount > 1 ? argList[1] : QGenericArgument(),
                           argCount > 2 ? argList[2] : QGenericArgument(),
                           argCount > 3 ? argList[3] : QGenericArgument(),
                           argCount > 4 ? argList[4] : QGenericArgument(),
                           argCount > 5 ? argList[5] : QGenericArgument(),
                           argCount > 6 ? argList[6] : QGenericArgument(),
                           argCount > 7 ? argList[7] : QGenericArgument(),
                           argCount > 8 ? argList[8] : QGenericArgument(),
                           argCount > 9 ? argList[9] : QGenericArgument()
                       );
            }
            return ret;
        }
    }
    return false;
}

void PluginManager::onPluginMessageReceived(const QString& sender, const QString& message, const QString& targetPluginName) {
    // 转发消息到主界面
    emit pluginMessageForwarded(sender, message);
    
    // 如果目标插件名称为空，则发送给所有插件（跳过发送者）
    if (targetPluginName.isEmpty()) {
        for (CameraPluginInterface *plugin : m_loadedPlugins) {
            if (plugin->pluginName() != sender) {
                plugin->onPluginMessage(sender, message);
            }
        }
    } else {
        // 否则只发送给指定名称的插件
        for (CameraPluginInterface *plugin : m_loadedPlugins) {
            if (plugin->pluginName() == targetPluginName) {
                plugin->onPluginMessage(sender, message);
                break; // 找到目标插件后退出循环
            }
        }
    }
}

bool PluginManager::onRequestPluginFunctionCall(const QString& targetPluginName, const QString& functionName, const QVariantList& args, QVariant& returnValue) {
    bool success = callPluginFunction(targetPluginName, functionName, args, returnValue);
    
    // 可以根据需要添加日志记录或错误处理
    if (!success) {
        qWarning() << "调用插件函数失败: " << targetPluginName << "." << functionName;
    }
    
    return success;
}
